diff --git a/common/scsi.c b/common/scsi.c
index d37222c..c456f5a 100644
--- a/common/scsi.c
+++ b/common/scsi.c
@@ -549,6 +549,52 @@
  * to the user if mode = 1
  */
 #if defined(CONFIG_DM_SCSI)
+static int do_scsi_scan_one(struct udevice *dev, int id, int lun, int mode)
+{
+	int ret;
+	struct udevice *bdev;
+	struct blk_desc bd;
+	struct blk_desc *bdesc;
+	char str[10];
+
+	/*
+	 * detect the scsi driver to get information about its geometry (block
+	 * size, number of blocks) and other parameters (ids, type, ...)
+	 */
+	scsi_init_dev_desc_priv(&bd);
+	if (scsi_detect_dev(id, lun, &bd))
+		return -ENODEV;
+
+	/*
+	* Create only one block device and do detection
+	* to make sure that there won't be a lot of
+	* block devices created
+	*/
+	snprintf(str, sizeof(str), "id%dlun%d", id, lun);
+	ret = blk_create_devicef(dev, "scsi_blk", str, IF_TYPE_SCSI, -1,
+			bd.blksz, bd.blksz * bd.lba, &bdev);
+	if (ret) {
+		debug("Can't create device\n");
+		return ret;
+	}
+
+	bdesc = dev_get_uclass_platdata(bdev);
+	bdesc->target = id;
+	bdesc->lun = lun;
+	bdesc->removable = bd.removable;
+	bdesc->type = bd.type;
+	memcpy(&bdesc->vendor, &bd.vendor, sizeof(bd.vendor));
+	memcpy(&bdesc->product, &bd.product, sizeof(bd.product));
+	memcpy(&bdesc->revision, &bd.revision,	sizeof(bd.revision));
+	part_init(bdesc);
+
+	if (mode == 1) {
+		printf("  Device %d: ", 0);
+		dev_print(bdesc);
+	}
+	return 0;
+}
+
 int scsi_scan(int mode)
 {
 	unsigned char i, lun;
@@ -576,59 +622,9 @@
 		/* Get controller platdata */
 		plat = dev_get_platdata(dev);
 
-		for (i = 0; i < plat->max_id; i++) {
-			for (lun = 0; lun < plat->max_lun; lun++) {
-				struct udevice *bdev; /* block device */
-				/* block device description */
-				struct blk_desc _bd;
-				struct blk_desc *bdesc;
-				char str[10];
-
-				scsi_init_dev_desc_priv(&_bd);
-				ret = scsi_detect_dev(i, lun, &_bd);
-				if (ret)
-					/*
-					 * no device detected?
-					 * check the next lun.
-					 */
-					continue;
-
-				/*
-				 * Create only one block device and do detection
-				 * to make sure that there won't be a lot of
-				 * block devices created
-				 */
-				snprintf(str, sizeof(str), "id%dlun%d", i, lun);
-				ret = blk_create_devicef(dev, "scsi_blk",
-						str, IF_TYPE_SCSI,
-						-1,
-						_bd.blksz,
-						_bd.blksz * _bd.lba,
-						&bdev);
-				if (ret) {
-					debug("Can't create device\n");
-					return ret;
-				}
-
-				bdesc = dev_get_uclass_platdata(bdev);
-				bdesc->target = i;
-				bdesc->lun = lun;
-				bdesc->removable = _bd.removable;
-				bdesc->type = _bd.type;
-				memcpy(&bdesc->vendor, &_bd.vendor,
-				       sizeof(_bd.vendor));
-				memcpy(&bdesc->product, &_bd.product,
-				       sizeof(_bd.product));
-				memcpy(&bdesc->revision, &_bd.revision,
-				       sizeof(_bd.revision));
-				part_init(bdesc);
-
-				if (mode == 1) {
-					printf("  Device %d: ", 0);
-					dev_print(bdesc);
-				} /* if mode */
-			} /* next LUN */
-		}
+		for (i = 0; i < plat->max_id; i++)
+			for (lun = 0; lun < plat->max_lun; lun++)
+				do_scsi_scan_one(dev, i, lun, mode);
 	}
 
 	return 0;
